/*
  JS垃圾回收机制

  1. 概念
    浏览器专门有一个线程用来清除堆空间对象数据的，垃圾回收器（GC）
    垃圾回收器每隔一段时间就会运行一次

  2. 策略
    - 引用计数法
      记录对象被引用次数（被引用一次记为1，被引用两次记为2，没有被引用记为0）
      当垃圾回收器运行时，清除引用次数0的垃圾对象
      
      问题：
        1. 每个对象都需要一个计数器，占内存
        2. 解决不了循环引用问题
        
    - 标记清除法
      将垃圾回收分为两个阶段：
        标记阶段：将使用的对象标记为“使用中”，没有使用的对象没有标记
        清除阶段：将没有使用的对象清空
      
      问题：
        1. 内存碎片化：导致内存没法全部利用上
        2. 内存分配速度比较慢

    - 标记整理法
      将垃圾回收分为三个阶段：
        标记阶段：将使用的对象标记为“使用中”，没有使用的对象没有标记
        整理阶段：将使用的对象往内存一端移动，没有使用的对象就在另外一端
        清除阶段：将没有使用的对象清空

    - Chrome浏览器V8引擎使用标记整理法，它还做了优化：新老生代垃圾回收

    - 新老生代垃圾回收
      将内存分为两部分，小一点内存是新生代区，大一点内存是老生代区
      新生代区：有新生代区垃圾回收机制
      老生代区：标记整理法

      新生代区：
        将内存一分为二，分为使用区和空闲区。将对象都存在使用区，当使用区快存满时，进行一次垃圾回收
        遍历使用区所有对象，如果是使用中，就复制到空闲区保管，直到所有遍历完毕，将使用区内容清空
        将空闲区变成使用区，使用区变成空闲区

        特殊情况：
          1. 如果复制到空闲区的对象大小超过 25%，晋升到老生代区
          2. 如果对象在经历多次新生代区垃圾回收都还存活，晋升到老生代区

*/
